草庐IT

javascript oop、instanceof 和基类

全部标签

c++ - 我可以使用 C 风格的转换将派生类转换为私有(private)基类吗?

我可以这样做吗?classA{...};classB:privateA{constA&foo()const{return*((constA*)this);}};我可以采用从基类私有(private)继承的子类并将其转换为基类的公共(public)版本吗?如果没有虚拟方法,我可以这样做吗?我的猜测是肯定的,但我想确保它是安全/便携的。 最佳答案 是的,您可以:标准§5.4/7:...thefollowingstatic_castandreinterpret_castoperations(optionallyfollowedbyacon

c++ - C++ 中 CV 限定的基类

在重构一些C++11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎不可能定义一个CV限定的(const、volatile或constvolatile)基类,例如:structA{inta=0;};structB:Aconst{};//ErrorherewithClangandGCC!但是,以下编译没有错误:structA{inta=0;};usingAC=Aconst;structB:AC{};//NOERRORHERE!?Qualifiersareignored.intmain(){Bb;b.a=42;//NOERRORmodifyingafieldofconstbase.ret

c++ - C++ 中 CV 限定的基类

在重构一些C++11代码时,我偶然发现了一件奇怪的事情。也就是说,似乎不可能定义一个CV限定的(const、volatile或constvolatile)基类,例如:structA{inta=0;};structB:Aconst{};//ErrorherewithClangandGCC!但是,以下编译没有错误:structA{inta=0;};usingAC=Aconst;structB:AC{};//NOERRORHERE!?Qualifiersareignored.intmain(){Bb;b.a=42;//NOERRORmodifyingafieldofconstbase.ret

c++ - 为什么 RVO 不应用于基类子对象初始化?

为什么Base的移动构造函数在以下代码(在gcc7.2和clang4.0中)的继承(classB)的情况下是强制性的?我希望在C++17中保证复制省略不需要它,就像组合(classA)的情况一样。structBase{Base(Base&&)=delete;Base&operator=(Base&&)=delete;Base(){}};Basemake_base(){returnBase{};}structA{A():b(make_base()){}//example 最佳答案 AccordingtoRichardSmith:Thi

c++ - 为什么 RVO 不应用于基类子对象初始化?

为什么Base的移动构造函数在以下代码(在gcc7.2和clang4.0中)的继承(classB)的情况下是强制性的?我希望在C++17中保证复制省略不需要它,就像组合(classA)的情况一样。structBase{Base(Base&&)=delete;Base&operator=(Base&&)=delete;Base(){}};Basemake_base(){returnBase{};}structA{A():b(make_base()){}//example 最佳答案 AccordingtoRichardSmith:Thi

c++ - 在派生类中重载基类方法

我试图理解为什么以下代码无法编译,显然解决方案依赖于在派生类中明确声明对method_A的依赖。请引用以下代码:classBase{public:voidmethod_A(intparam,intparam2){std::cout"test.cpp",(S)为“Derived::method_A(int)”指定了错误数量的参数。阻止派生类知道其基类正在实现它试图重载的方法的技术原因是什么?我希望更好地了解编译器/链接器在这种情况下的行为方式。 最佳答案 它被称为名称隐藏。当您定义一个与Base方法同名的非虚拟方法时,它会隐藏Deri

c++ - 在派生类中重载基类方法

我试图理解为什么以下代码无法编译,显然解决方案依赖于在派生类中明确声明对method_A的依赖。请引用以下代码:classBase{public:voidmethod_A(intparam,intparam2){std::cout"test.cpp",(S)为“Derived::method_A(int)”指定了错误数量的参数。阻止派生类知道其基类正在实现它试图重载的方法的技术原因是什么?我希望更好地了解编译器/链接器在这种情况下的行为方式。 最佳答案 它被称为名称隐藏。当您定义一个与Base方法同名的非虚拟方法时,它会隐藏Deri

c++ - 将基类指针转换为派生类指针

#includeusingnamespacestd;classBase{public:Base(){};~Base(){};};templateclassDerived:publicBase{T_val;public:Derived(){}Derived(Tval):_val(val){}Traw(){return_val;}};intmain(){Base*b=newDerived(1);Derived*d=b;coutraw()我现在有一些多态性问题,上面的代码总结了一切。我创建了一个基类指针,并将一个新的派生模板类的指针放入其中。然后我为派生模板类创建了一个新指针,我希望它具有基

c++ - 将基类指针转换为派生类指针

#includeusingnamespacestd;classBase{public:Base(){};~Base(){};};templateclassDerived:publicBase{T_val;public:Derived(){}Derived(Tval):_val(val){}Traw(){return_val;}};intmain(){Base*b=newDerived(1);Derived*d=b;coutraw()我现在有一些多态性问题,上面的代码总结了一切。我创建了一个基类指针,并将一个新的派生模板类的指针放入其中。然后我为派生模板类创建了一个新指针,我希望它具有基

c++ - 如果派生类析构函数抛出异常,基类析构函数会发生什么

刚好发生在我身上,我想知道在以下情况下如何释放资源。classBase{Resource*r;public:Base(){/*...*/}~Base(){deleter;}};classDerived:publicBase{public:Derived(){/*...*/}~Derived(){/*Suddenlysomethingherethrows!*/}};intmain(){try{Derivedd;}catch(...){/*whathappenedwithBase::r!?*/}}如果派生类析构函数抛出,会调用基类析构函数吗?还是会漏水? 最佳答